
import tensorflow as tf

#创建一个常量，产生一个1X2矩阵，这个op被作为一个节点
#加到默认图中
#
#构造器返回值代表该常量op的返回值
matrix_1 = tf.constant([[3.0,3.0]])

#创建另外一个常量op，产生一个2X1的矩阵
matrix_2 = tf.constant([[2.0],[2.0]])

#创建一个矩阵乘法 matmul op ，把matrix_1和matrix_2作为输入
#返回值product作为矩阵乘法的结果
product = tf.matmul(matrix_1,matrix_2)
# print("product=",product)
# print(product)

#
#默认图中有三个节点，两个constant() op 和一个matmul() op.
#为了进行真正矩阵相乘运算，并得到矩阵乘法的结果，你必须在会话中启动这个图
#

#启动默认图
sess = tf.Session()

#调用sess的run()方法来执行矩阵乘法op，传入product作为该方法的参数
#上面提到，product是代表矩阵乘法op的输出，传入它是向方法表明，我们是希望取回矩阵乘法op的输出
#
#整个执行过程是自动化的，会话负责传递op所需要的全部输入，op通常是并发执行的
#

#返回值result是一个numpy ndarray对象
result = sess.run(product)
print(result)

# 任务完成，关闭会话
sess.close()

# Session对象在使用完后需要关闭释放资源，除了显式调用close方法外，也可以使用with代码块来自动完成关闭操作
# with tf.Session as sess:
#     result = sess.run(product)
#     print(result)

# 在实现上，TensorFlow将图形定义转换成分布式操作，以充分利用可用的计算资源，如GPU或CPU。
# 一般来说，你不需要显式指定使用GPU还是CPU，TensorFlow能自动检测
# 如果检测到GPU，TensorFlow会尽可能地利用找到的第一个GPU来执行操作
#
# 如果机器上有超过一个可用的GPU，除了第一个外的其他的GPU默认是不参与运算的
# 为了让TensorFlow使用这些GPU，你必须将op明确的指派给它们执行
# with...Device语句用来指派特定的CPU或GPU来执行操作，如下
# with tf.Session() as sess:
#     with tf.device("/gpu:1"):
#         matrix_1 = tf.constant([[3.,3.]])
#         matrix_2 = tf.constant([[2.],[2.]])
#         product = tf.matmul(matrix_1,matrix_2)
#         result = sess.run(product)
#         print(result)

# 设备用字符串进行标识，目前支持的设备包括：
#     "/cpu:0":机器的cpu
#     "/gpu:0":机器的第一个GPU，如果有的话
#     "/gpu:1":机器的第二个GPU，以此类推